package com.huida.app.others.templatemethod.businessdemo;

import org.apache.commons.lang.math.RandomUtils;

import java.math.BigDecimal;
import java.util.Scanner;
import java.util.function.Consumer;

/**
 * @Description: 模板方法设计模式的抽象类
 * @Author: Wangzz
 * @Version: 1.0.0
 * @CreateDate: Created in 2021/11/7 16:26
 * @UpdateDate: [dateFormat:YYYY-MM-DD][modifier][description]
 */
public abstract class AbstractBusinessHandler {

    /**
     * 模板方法
     */
    public final void execute() {
        // 1.取号(fixed)
        getNumber();
        // 2.办理业务(non-fixed)
        Scanner input = new Scanner(System.in);
        handle(new BigDecimal(String.valueOf(input.nextDouble())));
        // 3.评价(fixed)
        judge();
    }

    /**
     * 取号
     */
    public void getNumber() {
        System.out.println("number - 00" + RandomUtils.nextInt());
    }

    /**
     * 办理业务
     * */
    public abstract void handle(BigDecimal account); // 抽象的办理业务方法，由子类实现

    /**
     * 评价
     * */
    private void judge(){
        System.out.println("give a praised!");
    }

}


// 【Java8提供Consumer、Supplier、Predicate、Function等】
// Supplier是一个提供型接口 Consumer消费型接口
 class BankBusinessHandler{
    private void execute(Consumer<BigDecimal> consuemr){
        getNumber();
        consuemr.accept(null);
        judge();
    }

    private void getNumber(){
        System.out.println("number - 00" + RandomUtils.nextInt());
    }

    private void judge(){
        System.out.println("give a praised!");
    }

    // ============= 业务方法 =============
    public void save(BigDecimal account){
        execute(e -> System.out.println("save: " + account));
    }

    public void draw(BigDecimal amount) {
        execute(a -> System.out.println("draw " + amount));
    }

    public void moneyManage(BigDecimal amount) {
        execute(a -> System.out.println("draw " + amount));
    }

}
// 【传统方法：定义多个子类实现不同的业务逻辑】声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。

// 存钱业务的实现类
class SaveMoneyHandler extends AbstractBusinessHandler{
    @Override
    public void handle(BigDecimal account) {
        System.out.println("save money: " + account);
    }
}

// 取钱业务的实现类

class DrawMoenyHandler extends AbstractBusinessHandler{
    @Override
    public void handle(BigDecimal account) {
        System.out.println("draw money: " + account);
    }
}

// 理财业务的实现类
class MoneyManageHandler extends AbstractBusinessHandler{

    @Override
    public void handle(BigDecimal account) {
        System.out.println("manage money: " + account);
    }
}